/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.controller;

import br.com.folha.dao.DiaSemanaDao;
import br.com.folha.dao.DisponibilidadeDao;
import br.com.folha.dao.GenericoDao;
import br.com.folha.dao.ProfessorDao;
import br.com.folha.dao.TipoContratoDao;
import br.com.folha.dao.TipologiaDao;
import br.com.folha.dao.TurmaDao;
import br.com.folha.dao.UnidadeDao;
import br.com.folha.dao.unidadeTipologiaDao;
import br.com.folha.entity.DiaSemana;
import br.com.folha.entity.DisponibilidadeProfessor;
import br.com.folha.entity.Professor;
import br.com.folha.entity.ProfessorUnidadeTipologia;
import br.com.folha.entity.TipoContrato;
import br.com.folha.entity.Tipologia;
import br.com.folha.entity.TurmaAula;
import br.com.folha.entity.Unidade;
import br.com.folha.service.ProfessorService;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;
import java.io.InputStream;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

/**
 *
 * @author marceloml
 */
@ManagedBean(name = "ProfessorController")
@ViewScoped
public final class ProfessorController implements Serializable{
    
    private static final long serialVersionUID = 1L;
    private Professor professor;
    private Professor professorSelecionado;
    private ProfessorDao consulta = new ProfessorDao();
    private GenericoDao professorDAO = new GenericoDao();
    
    private Unidade unidade;
    private UnidadeDao unidadeDao = new UnidadeDao();
        
    private boolean  ativoSelecionado;
    private boolean professorProblema;
    private Map<String,Integer> unidades; 
    private List<Professor> filtered;
    private List<String> suaLista;
    private Integer selectedUnidades;           
    
    private TipologiaDao tipologiaDao = new TipologiaDao();
    private Tipologia tipologia;
    private Map<String,Integer> tipologias;    
    private Integer selectedTipologia;
    
    private transient DataModel lista;
    private boolean retorno;
    private Long resultado;
    private Date data = new Date();
    private String acao;
    private boolean ativoInativo;
    
    private String hora_ini;
    private String hora_fim;
    private Integer selectedDiaSemana;   
    private Integer selectedTurno;
    private Integer selectedContrato;
    private DiaSemana diaSemana;
    private DiaSemanaDao diaSemanaDao = new DiaSemanaDao();
    private TipoContrato tipoContrato;
    private TipoContratoDao tipoContratoDao = new TipoContratoDao();  
    private DisponibilidadeDao disponibilidadeDao = new DisponibilidadeDao();
    private DisponibilidadeProfessor disponibilidadeProfessor;
    private DisponibilidadeProfessor disponibilidadeSelecionada;
    private transient DataModel listaDisponibilidade;
    private String acaoDisponibilidade;
    
    private unidadeTipologiaDao unidadeTipologiaDao = new unidadeTipologiaDao();
    private transient DataModel listaUnidadeTipologia;
    private ProfessorUnidadeTipologia unidadeTipologiaSelecionada;
    private ProfessorUnidadeTipologia unidadeTipologia;
    
    private TurmaDao turmaDao = new TurmaDao();
    
    private String acaoUnidadeTipologia = "";
    private Integer ultimoProfessor = 0;
    private List<TurmaAula> retornoTurma;
    private List<Professor> professorConsultado = null;    
    private Integer selectedUnidadeTipologia;
    
    public ProfessorController() {                               
        
        professor = new Professor();   
        disponibilidadeProfessor = new DisponibilidadeProfessor();

        unidadeTipologia = new ProfessorUnidadeTipologia();
        
        this.professorProblema = false;        
        this.ativoSelecionado  = true;                       
        this.ativoInativo      = true;
       
       acao = "";
       acaoDisponibilidade = "";
                        
    }
    
    public Collection<SelectItem>  getCarregarUnidade(){                
        
        unidade = new Unidade();        
        LoginController usuarioLogado = new LoginController();        
        List<Integer> integerArray = new ArrayList<Integer>();
        
        for (Iterator iterator = usuarioLogado.Usuario.getUnidades().iterator(); iterator.hasNext();){            
            Unidade unidade = (Unidade) iterator.next();                                 
            integerArray.add(unidade.getId());        
        }        
        
        Collection<SelectItem> lst = new ArrayList<SelectItem>();        
        lst.add(new SelectItem(null, "Selecione a Unidade"));      //Primeiro item do select   
        List<Unidade> lista = unidadeDao.listaUnidade(unidade,integerArray);
        for (int i = 0; i < lista.size(); i++) {
            lst.add(new SelectItem(lista.get(i).getId(), lista.get(i).getNome()));              
        }          
        return lst;                  
        
    }     
    
  public Collection<SelectItem> getCarregarSelect() {        
      
      tipologia = new Tipologia();
      
        Collection<SelectItem> lst = new ArrayList<SelectItem>();        
        lst.add(new SelectItem(null, "Selecione a tipologia"));      //Primeiro item do select   
        List<Tipologia> lista = tipologiaDao.listaTipologia(tipologia);
        for (int i = 0; i < lista.size(); i++) {          
            lst.add(new SelectItem(lista.get(i).getId(), lista.get(i).getNome()+" - "+lista.get(i).getValor()));              
        }          
        return lst;          
    }    
    
    //Funções
    
    public void preparaInclusao(){                       
        
        FacesMessage msg = null;    
        
      if(professor.getNome().equals("")){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "O nome deve ser informado!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                                           
        
        }else if(professor.getCpf().equals("")){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "O CPF deve ser informado!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                      

        }else{
            
            /*
             * Lógica utilizada para verificar se o usuário está informando um CPF já existente
             * no Sistema, caso já exista é perguntado o usuário deseja editar o professor já 
             * existente
             */
            ProfessorService service = new ProfessorService();
            professorConsultado = service.validaProfessor(professor.getCpf(), acao, professor);
            
            /*
             * Caso o retorno da consulta retorne diferente de null é exibido o dialog com o questionamento
             * se o usuário deseja editar o professor já existente com o mesmo CPF
             */
            if(professorConsultado != null){
            
                org.primefaces.context.RequestContext.getCurrentInstance().execute("consultaProfessor.show();");  
                org.primefaces.context.RequestContext.getCurrentInstance().update(":dlgConsultaProfessor");                                                   
            
            }else{
            
                /*
                 * Aqui é verificado se o professor está sendo incluído
                 * ou atualizado
                 */                        
                if(!acao.equals("edicao")){

                            salvaOperacao();

                }else{

                    editaProfessor();

                }
            
            }
            
        }
        
    }
    
    public void salvaOperacao(){
        
        FacesMessage msg = null;                 
                        
        //Seta a data de Cadastro
        professor.setDt_cadastro(data);
        
        LoginController usuarioLogado = new LoginController();
        
        //Seta usuário que cadastrou o professor
        professor.setUsuario_cadastro(usuarioLogado.Usuario.getId());        
        
        //Seta se o professor estará ativo ou não        
         professor.setAtivo(this.ativoSelecionado);        
         professor.setProblema(this.professorProblema);                  
        
        retorno = professorDAO.salvar(professor);
        
        ultimoProfessor = consulta.ultimoSeq();
        
        org.primefaces.context.RequestContext.getCurrentInstance().execute("unidadeTipologia.show();");  
        org.primefaces.context.RequestContext.getCurrentInstance().update(":dlgUnidadeTipologia");        
        
        resetUnidadeTipologia();
        
        if(retorno){                   
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Professor cadastrado com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        
                if(this.ativoInativo){

                    lista = new ListDataModel(consulta.listaProfessorAtivo(Professor.class));
                }else{

                    lista = new ListDataModel(professorDAO.listar(professor));
                }                
        
    }
    
    public void editaProfessor(){
        
        FacesMessage msg = null;                     
                        
        //Seta data de atualização
        professor.setDt_atualizacao(data);
        
        LoginController usuarioLogado = new LoginController();
        
        //Seta usuário que está alterando o professor
        professor.setUsuario_atualizacao(usuarioLogado.Usuario.getId());
        
       //Seta se o professor estará ativo ou não
        professor.setAtivo(this.ativoSelecionado);
        professor.setProblema(this.professorProblema); 
        
        if(this.ativoSelecionado == false){
            
            retornoTurma = turmaDao.consultaAulaProfessor(consulta.getById(professor.getId()));
         
            if(retornoTurma.isEmpty()){

                retorno = professorDAO.atualizar(professor);

                resetProfessor();

                listaProfessores();               

                if(retorno){           

                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Professor atualizado com sucesso!", "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);

                }                

            }else{
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Professor não pode ser inativado, pois está agendado para dar aula!", "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);            
            }            
            
        }else{
                retorno = professorDAO.atualizar(professor);

                resetProfessor();

                listaProfessores();               

                if(retorno){           

                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Professor atualizado com sucesso!", "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);

                }                            
        }
        
    }    
    
    public void deleteProfessor() {        
        
        FacesMessage msg = null;  
        
        retorno = professorDAO.excluir(this.professorSelecionado); 
        
        if(retorno){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Professor excluído corretamente!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
        
            resetProfessor();
            listaProfessores();
        
        }else{
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao excluir professor!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                        
            
        }
    }      
    
    public Professor preparaEdicao(){                
        
        //Instancio um arraiy de booleanos e incluo o retorno se o professor a ser editado está ativo ou não        
        this.ativoSelecionado = this.professorSelecionado.getAtivo();                
        
        this.professorProblema = this.professorSelecionado.getProblema();                               
        
        professor = this.professorSelecionado;
        acao = "edicao";
        
        getCarregarUnidadeTipologia();
        
        return professor;                
    }
    
    public void carregaProfessor(){
        
        /*
         * É passa para o objeto Professor corrente o retorno da consulta aos professores
         */
        professor = professorConsultado.get(0);
        
        /*
         * Como foi carregado em tela os dados do professor retornado na consulta
         * a variavel acao fica flagada como edicao
         */
        acao = "edicao";
        
    }
    
    public void resetProfessor(){
        acao = "";        
        
        this.professor = new Professor();   
        
        this.ativoSelecionado = true;
        this.professorProblema = false;        
        this.ultimoProfessor   = 0;
        
        if(this.ativoInativo){
            
            lista = new ListDataModel(consulta.listaProfessorAtivo(Professor.class));
        }else{
            
            lista = new ListDataModel(consulta.listaProfessor(Professor.class));
        }        
                
    }    
    
    public void listaProfessores(){
        
        if(this.ativoInativo){
            
            lista = new ListDataModel(consulta.listaProfessorAtivo(Professor.class));
        }else{
            
            lista = new ListDataModel(consulta.listaProfessor(Professor.class));
        }
        
    }
    
    //Getter e Setter
    
    public Professor getProfessor() {
        return professor;
    }

    public void setProfessor(Professor Professor) {
        this.professor = Professor;
    }
    
    
    public DataModel getLista() {
        
        if(lista == null || lista.getRowCount() == 0){
        
                if(this.ativoInativo){

                    lista = new ListDataModel(consulta.listaProfessorAtivo(Professor.class));
                }else{

                    lista = new ListDataModel(professorDAO.listar(professor));
                }        
        
        }
        
        return lista;
    }    
    
    public boolean getAtivoSelecionado() {
        return ativoSelecionado;
    }
    
    public void validaAtivo(){
        
        if(this.professorProblema){
        
            this.ativoSelecionado = false;
            FacesMessage msg = null;
                         msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não será permitido ativar esse Professor!", "");
                         FacesContext.getCurrentInstance().addMessage(null, msg);            
        }
               
    }
    
    public void marcaAtivo(){
        if(this.professorProblema){            
            this.ativoSelecionado = false;
        }else{
            this.ativoSelecionado = true;
        }
    }
    
    /*
     * Bloco que tratará as horas contratadas do professor
     */
    
    public void resetDisponibilidade(){
        
        this.selectedDiaSemana = 0;
        this.selectedContrato  = 0;        
        this.selectedUnidadeTipologia = 0;
        this.selectedTurno     = 0;
        this.hora_ini          = "";
        this.hora_fim          = "";
        
    }
    
    public Collection<SelectItem> getCarregarDiaSemana() {                                      

          diaSemana = new DiaSemana();

          Collection<SelectItem> lst = new ArrayList<SelectItem>();        
          lst.add(new SelectItem(0, "Selecione o Dia da Semana"));      //Primeiro item do select   
          List<DiaSemana> lista = diaSemanaDao.listaDiaSemana(diaSemana);
          for (int i = 0; i < lista.size(); i++) {                    
              
              lst.add(new SelectItem(lista.get(i).getId(), lista.get(i).getNome()));              
          }          
          return lst;    

      }
    
    public Collection<SelectItem> getCarregarTipoContrato() {                                      

          tipoContrato = new TipoContrato();

          Collection<SelectItem> lst = new ArrayList<SelectItem>();        
          lst.add(new SelectItem(0, "Selecione o tipo de Contratação"));      //Primeiro item do select   
          List<TipoContrato> lista = tipoContratoDao.listaTipoContrato(tipoContrato);          
          for (int i = 0; i < lista.size(); i++) {                                  
              lst.add(new SelectItem(lista.get(i).getId(), lista.get(i).getDescricao()));              
          }          
          return lst;    

      } 
    
    public Collection<SelectItem> getCarregarUnidadeTipologia() {                                               

          Collection<SelectItem> lst = new ArrayList<SelectItem>();        
          lst.add(new SelectItem(0, "Selecione a unidade"));      //Primeiro item do select   
          System.out.println("PRofessor :"+professor.getId());
          List<ProfessorUnidadeTipologia> lista = unidadeTipologiaDao.listaUnidadeTipologia(unidadeTipologia, professor.getId());
          System.out.println("Tamanho :"+lista.size());
          for (int i = 0; i < lista.size(); i++) {                    
              System.out.println("Unidades :"+lista.get(i).getUnidade().getNome());
              lst.add(new SelectItem(lista.get(i).getId(), lista.get(i).getUnidade().getNome()));              
          }          
          return lst;    

      }    
    
    public void preparaInclusaoDisponibilidade(){                        
        
        FacesMessage msg = null;        
        
        if(selectedDiaSemana == 0){
                        
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "O dia da semana deve ser informado!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);  
            
        }else if(selectedTurno == 0){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "O turno deve ser informado!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);              
            
        }else if(selectedUnidadeTipologia == 0){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "A Unidade deve ser informada!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                          
        
        }else if(hora_ini.equals("") || hora_ini == null){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "A hora inicial deve ser informada!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);  
            
        }else if(hora_fim.equals("") || hora_fim == null){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "A hora inicial deve ser informada!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
            
        /*
         * Tratamento para que o usuário não inclua uma hora final menor ou igual a hora inicial
         */        
        }else if(Integer.parseInt(this.hora_fim.substring(0, 2)+this.hora_fim.substring(3, 5)) <= Integer.parseInt(this.hora_ini.substring(0, 2)+this.hora_ini.substring(3, 5))){
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Hora Final menor ou igual a Hora Inicial", "");
                FacesContext.getCurrentInstance().addMessage(null, msg);            
            
        }else{
            
            /*
             * Aqui é verificado se o professor está sendo incluído
             * ou atualizado
             */        
            
            if(!acaoDisponibilidade.equals("edicao")){

                        salvaDisponibilidade();
        
            }else{
                
                editaDisponibilidade();
                acaoDisponibilidade = "";
            }
            
        }
        
    }     
    
    public void salvaDisponibilidade(){
        
        FacesMessage msg = null;  
        
        disponibilidadeProfessor.setDiaSemana(diaSemanaDao.getById(selectedDiaSemana));
        disponibilidadeProfessor.setTurno(selectedTurno);
        disponibilidadeProfessor.setTipoContrato(tipoContratoDao.getById(selectedContrato));
        disponibilidadeProfessor.setProfessorUnidadeTipologia(unidadeTipologiaDao.getById(selectedUnidadeTipologia));
        
        disponibilidadeProfessor.setProfessor(professor.getId());
        
        Date dataAtual = new Date();
        Calendar calendar = Calendar.getInstance();  
        
        calendar.setTime(dataAtual);    
        
        calendar.set(Calendar.HOUR_OF_DAY,Integer.parseInt(hora_ini.substring(0, 2)));        
        calendar.set(Calendar.MINUTE,Integer.parseInt(hora_ini.substring(3, 5)));
        calendar.set(Calendar.SECOND,0);        
        
        disponibilidadeProfessor.setHora_ini(calendar.getTime());
        
        calendar.clear();
        
        calendar.setTime(dataAtual);    
        
        calendar.set(Calendar.HOUR_OF_DAY,Integer.parseInt(hora_fim.substring(0, 2)));        
        calendar.set(Calendar.MINUTE,Integer.parseInt(hora_fim.substring(3, 5)));
        calendar.set(Calendar.SECOND,0);
        
        disponibilidadeProfessor.setHora_fim(calendar.getTime());
        
        //Seta a data de Cadastro
        disponibilidadeProfessor.setDt_cadastro(data);
        
        LoginController usuarioLogado = new LoginController();
        
        //Seta usuário que cadastrou a disponibilidade
        disponibilidadeProfessor.setUsuario_cadastro(usuarioLogado.Usuario.getId());
        
        retorno = professorDAO.salvar(disponibilidadeProfessor);                
        
        resetDisponibilidade();
        
        listaDisponibilidade = new ListDataModel(disponibilidadeDao.listaDisponibilidade(disponibilidadeProfessor, professor.getId()));
        
        if(retorno){                      
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Disponibilidade cadastrada com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
        }else{
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao atualizar Disponibilidade!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
        }
        
    }
    
    public void editaDisponibilidade(){
        
        FacesMessage msg = null; 
        
        this.disponibilidadeProfessor.setDiaSemana(diaSemanaDao.getById(selectedDiaSemana));
        this.disponibilidadeProfessor.setTurno(selectedTurno);
        this.disponibilidadeProfessor.setTipoContrato(tipoContratoDao.getById(selectedContrato));
        
        this.disponibilidadeProfessor.setProfessor(professor.getId());        
        
        Date dataAtual = new Date();
        Calendar calendar = Calendar.getInstance();  
        
        calendar.setTime(dataAtual);    
        
        calendar.set(Calendar.HOUR_OF_DAY,Integer.parseInt(hora_ini.substring(0, 2)));        
        calendar.set(Calendar.MINUTE,Integer.parseInt(hora_ini.substring(3, 5)));
        calendar.set(Calendar.SECOND,0);        
        
        disponibilidadeProfessor.setHora_ini(calendar.getTime());
        
        calendar.clear();
        
        calendar.setTime(dataAtual);    
        
        calendar.set(Calendar.HOUR_OF_DAY,Integer.parseInt(hora_fim.substring(0, 2)));        
        calendar.set(Calendar.MINUTE,Integer.parseInt(hora_fim.substring(3, 5)));
        calendar.set(Calendar.SECOND,0);
        
        disponibilidadeProfessor.setHora_fim(calendar.getTime());        
        
        //Seta a data de Cadastro
        this.disponibilidadeProfessor.setDt_atualizacao(data);
        
        LoginController usuarioLogado = new LoginController();        
        
        this.disponibilidadeProfessor.setUsuario_atualizacao(usuarioLogado.getUsuario().getId());
        
        retorno = professorDAO.atualizar(this.disponibilidadeProfessor);
        
        resetDisponibilidade();
        
        listaDisponibilidade = new ListDataModel(disponibilidadeDao.listaDisponibilidade(disponibilidadeProfessor, professor.getId()));
        
        if(retorno){                      
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Disponibilidade Atualizada com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
        }else{
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao atualizar Disponibilidade!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
        }        
        
    }
    
    public void preparaEdicaoDisponibilidade(){
        
        this.selectedDiaSemana = this.disponibilidadeSelecionada.getDiaSemana().getId();
        this.selectedTurno     = this.disponibilidadeSelecionada.getTurno();
        this.selectedUnidadeTipologia = this.disponibilidadeSelecionada.getProfessorUnidadeTipologia().getId();
        this.hora_ini          = String.valueOf(this.disponibilidadeSelecionada.getHora_ini());
        this.hora_fim          = String.valueOf(this.disponibilidadeSelecionada.getHora_fim());
        
        this.selectedContrato  = this.disponibilidadeSelecionada.getTipoContrato().getId();
        
        this.disponibilidadeProfessor = this.disponibilidadeSelecionada;
        
        this.acaoDisponibilidade = "edicao";
        
    }
    
    public void deleteDisponibilidade(){
        
        FacesMessage msg = null; 
        
        if(this.disponibilidadeSelecionada == null){
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Selecione um registro para deletar!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);             
        }else{
            
            retorno = professorDAO.excluir(this.disponibilidadeSelecionada);
                     
            resetDisponibilidade();           
            listaDisponibilidade = new ListDataModel(disponibilidadeDao.listaDisponibilidade(disponibilidadeProfessor, professor.getId()));
            
            if(retorno){
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Registro excluído com sucesso!", "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);                  
            }else{
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao excluir registro!", "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);                                  
            }
            
        }                
        
    }
    
    /*
     * Tratamento de inclusão de um relacionamento Unidade x Tipologia
     */
    
    public void preparaInclusaoUnidadeTipologia(){
        
        FacesMessage msg = null;        
        
        if(this.professor.getId() == null || this.professor.getId() == 0){
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Nenhum professor selecionado!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                                      
        }else if(selectedUnidades == 0){
                        
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "A unidade deve ser informada!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);  
            
        }else if(selectedTipologia == 0){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "A tipologia deve ser informada!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                              
            
        }else{
            
            /*
             * Aqui é verificado se a UnidadexTipologia está sendo incluído
             * ou atualizado
             */        
            
            if(!acaoUnidadeTipologia.equals("edicao")){
                
                Integer retornoUnidade = unidadeTipologiaDao.consultaProfessorUnidade(this.professor.getId(), unidadeDao.getById(selectedUnidades));
                
                if(retornoUnidade != 0){
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "O professor já está relacionado a esta unidade!", "");
                        FacesContext.getCurrentInstance().addMessage(null, msg);                                                  
                }else{

                        salvaUnidadeTipologia();                        
                        listaProfessores();                                  
                }
            }else{
                
                //editaUnidadeTipologia();
                acaoUnidadeTipologia = "";
            }
            
        }        
        
    }
    
    public void salvaUnidadeTipologia(){
        
        FacesMessage msg = null;        
        
        if(this.professor.getId() != 0 && this.professor.getId() != null){
            this.unidadeTipologia.setProfessor(this.professor.getId());
        }else{
            this.unidadeTipologia.setProfessor(this.ultimoProfessor);
        }
        this.unidadeTipologia.setTipologia(tipologiaDao.getById(selectedTipologia));
        this.unidadeTipologia.setUnidade(unidadeDao.getById(selectedUnidades));
        
        //Seta a data de Cadastro
        this.unidadeTipologia.setDt_atualizacao(data);
        
        LoginController usuarioLogado = new LoginController();                
        this.unidadeTipologia.setUsuario_atualizacao(usuarioLogado.getUsuario().getId());        
        
        retorno = professorDAO.salvar(this.unidadeTipologia);
        
        if(retorno){
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Unidade e Tipologia incluídas com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                                          
        }else{
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao salvar Unidade e Tipologia!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                                                      
        }
        
        listaUnidadeTipologia = new ListDataModel(unidadeTipologiaDao.listaUnidadeTipologia(unidadeTipologia, this.professor.getId()));
        resetUnidadeTipologia();
    }
    
    public void deleteUnidadeTipologia(){

        FacesMessage msg = null;        
        
        if(this.unidadeTipologiaSelecionada == null){
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Selecione um registro!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);                                                                  
        }else{
            professorDAO.excluir(this.unidadeTipologiaSelecionada);
        }
        
        listaUnidadeTipologia = new ListDataModel(unidadeTipologiaDao.listaUnidadeTipologia(unidadeTipologia, this.professor.getId()));
        resetUnidadeTipologia();
        
    }   
    
    /*
     * Geração do relatorio
     */
    
    public void sampleReportPDF() throws IOException{    

    try {        
        
        InputStream relatorio = getClass().getResourceAsStream("../relatorios/professores.jasper");
        System.out.println("Relatorio :"+relatorio);
        HashMap<String, Integer> params = new HashMap<String, Integer>();
        
        List<Professor> listProfessor = new ArrayList<Professor>();                
                
        for (Iterator iterator = professorDAO.listar(professor).iterator(); iterator.hasNext();){       
            
            Professor professor = (Professor) iterator.next();             
            
                listProfessor.add(professor);
            
        }     
        
        JRDataSource jrds = new JRBeanCollectionDataSource(listProfessor);
        
        JasperPrint print = JasperFillManager.fillReport(relatorio,new HashMap(), jrds);
         
        byte[] bytes = JasperExportManager.exportReportToPdf(print);        

         //JasperReport jasperReport = (JasperReport)JRLoader.loadObject(getClass().getClassLoader().getResourceAsStream("../relatorios/sampleReport.jasper"));
         //relatorio.setWhenNoDataType(WhenNoDataTypeEnum.ALL_SECTIONS_NO_DETAIL);                       
        
        JasperViewer.viewReport(print, false);             
        
         //outputStream.write(bytes,0,bytes.length);
         //facesContext.responseComplete();
         //outputStream.flush();
         
         //JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
         //JRExporter exporter = new net.sf.jasperreports.engine.export.JRHtmlExporter();
         //JRExporter exporter = new net.sf.jasperreports.engine.export.JRXlsExporter();
         //JRExporter exporter = new net.sf.jasperreports.engine.export.JRXmlExporter();
         //JRExporter exporter = new net.sf.jasperreports.engine.export.JRCsvExporter();

         //exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, pdfFile);
//         exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, Teste);
//         exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
//         exporter.exportReport();

         //relatorio = new ByteArrayInputStream(Teste.toByteArray());

     } catch (JRException ex) {
         Logger.getLogger(ex.getMessage()).log(Level.SEVERE, null, ex);
         System.out.println("Erro relatório :"+ex.getMessage());
     }
     

    }
            
    public void resetUnidadeTipologia(){
        
        this.selectedTipologia = 0;
        this.selectedUnidades  = 0;
                
    }
    
    public Professor getProfessorSelecionado() {
        return professorSelecionado;
    }

    public void setProfessorSelecionado(Professor professorSelecionado) {
        this.professorSelecionado = professorSelecionado;
    }      

    public void setAtivoSelecionado(boolean ativoSelecionado) {
        
        this.ativoSelecionado = ativoSelecionado;
    }    
    
    public List<String> getSuaLista() {
        return suaLista;
    }

    public void setSuaLista(List<String> suaLista) {
        this.suaLista = suaLista;
    }    
    
    public Integer getSelectedUnidades() {
        return selectedUnidades;
    }

    public void setSelectedUnidades(Integer selectedUnidades) {
        this.selectedUnidades = selectedUnidades;
    }    
    
    public Map<String,Integer> getUnidades() {
        return unidades;
    }    
    
    public List<Professor> getFiltered() {        
        return filtered;
    }

    public void setFiltered(List<Professor> filtered) {
        this.filtered = filtered;
    }           

    public Tipologia getTipologia() {
        return tipologia;
    }

    public void setTipologia(Tipologia tipologia) {
        this.tipologia = tipologia;
    }

    public Map<String,Integer> getTipologias() {
        return tipologias;
    }

    public void setTipologias(Map<String,Integer> tipologias) {
        this.tipologias = tipologias;
    }

    public Integer getSelectedTipologia() {
        return selectedTipologia;
    }

    public void setSelectedTipologia(Integer selectedTipologia) {
        this.selectedTipologia = selectedTipologia;
    }

    public boolean isAtivoInativo() {
        return ativoInativo;
    }

    public void setAtivoInativo(boolean ativoInativo) {
        this.ativoInativo = ativoInativo;
    }

    public boolean getProfessorProblema() {        
        return professorProblema;
    }

    public void setProfessorProblema(boolean professorProblema) {          
        this.professorProblema = professorProblema;
    }

    public String getHora_ini() {
        return hora_ini;
    }

    public void setHora_ini(String hora_ini) {
        this.hora_ini = hora_ini;
    }

    public Integer getSelectedDiaSemana() {
        return selectedDiaSemana;
    }

    public void setSelectedDiaSemana(Integer selectedDiaSemana) {
        this.selectedDiaSemana = selectedDiaSemana;
    }

    public Integer getSelectedTurno() {
        return selectedTurno;
    }

    public void setSelectedTurno(Integer selectedTurno) {
        this.selectedTurno = selectedTurno;
    }

    public DataModel getListaDisponibilidade() {
        
            if(listaDisponibilidade == null || listaDisponibilidade.getRowCount() == 0){
                        
                    listaDisponibilidade = new ListDataModel(disponibilidadeDao.listaDisponibilidade(disponibilidadeProfessor, professor.getId()));        
                    
            }
        
        return listaDisponibilidade;
    }

    public void setListaDisponibilidade(DataModel listaDisponibilidade) {
        this.listaDisponibilidade = listaDisponibilidade;
    }

    public DisponibilidadeProfessor getDisponibilidadeProfessor() {
        return disponibilidadeProfessor;
    }

    public void setDisponibilidadeProfessor(DisponibilidadeProfessor disponibilidadeProfessor) {
        this.disponibilidadeProfessor = disponibilidadeProfessor;
    }

    public DisponibilidadeProfessor getDisponibilidadeSelecionada() {
        return disponibilidadeSelecionada;
    }

    public void setDisponibilidadeSelecionada(DisponibilidadeProfessor disponibilidadeSelecionada) {
        this.disponibilidadeSelecionada = disponibilidadeSelecionada;
    }

    /**
     * @return the listaUnidadeTipologia
     */
    public DataModel getListaUnidadeTipologia() {
        
        if(listaUnidadeTipologia == null || listaUnidadeTipologia.getRowCount() == 0){                        

                    listaUnidadeTipologia = new ListDataModel(unidadeTipologiaDao.listaUnidadeTipologia(unidadeTipologia, professor.getId()));
        
        }        
        
        return listaUnidadeTipologia;
    }

    public void setListaUnidadeTipologia(DataModel listaUnidadeTipologia) {
        this.listaUnidadeTipologia = listaUnidadeTipologia;
    }

    public ProfessorUnidadeTipologia getUnidadeTipologiaSelecionada() {
        return unidadeTipologiaSelecionada;
    }

    public void setUnidadeTipologiaSelecionada(ProfessorUnidadeTipologia unidadeTipologiaSelecionada) {
        this.unidadeTipologiaSelecionada = unidadeTipologiaSelecionada;
    }

    public ProfessorUnidadeTipologia getUnidadeTipologia() {
        return unidadeTipologia;
    }

    public void setUnidadeTipologia(ProfessorUnidadeTipologia unidadeTipologia) {
        this.unidadeTipologia = unidadeTipologia;
    }

    public String getHora_fim() {
        return hora_fim;
    }

    public void setHora_fim(String hora_fim) {
        this.hora_fim = hora_fim;
    }

    public Integer getSelectedContrato() {
        return selectedContrato;
    }

    public void setSelectedContrato(Integer selectedContrato) {
        this.selectedContrato = selectedContrato;
    }

    public TipoContrato getTipoContrato() {
        return tipoContrato;
    }

    public void setTipoContrato(TipoContrato tipoContrato) {
        this.tipoContrato = tipoContrato;
    }

    public Integer getSelectedUnidadeTipologia() {
        return selectedUnidadeTipologia;
    }

    public void setSelectedUnidadeTipologia(Integer selectedUnidadeTipologia) {
        this.selectedUnidadeTipologia = selectedUnidadeTipologia;
    }
   
}